package com.vinjogames.som.entities;

import javax.microedition.khronos.opengles.GL10;

import android.graphics.PointF;

public class Map {
	private Tile[][] mTiles;
	private Tile[][] mLoadedTiles;
	
	
	public static final int LOAD_WIDTH  = 10;
	public static final int LOAD_HEIGHT = 6;   //TODO:  increase, draw a couple of tiles out, ideally max zoom out
	
	public static final int ZONE_WIDTH  = 25;  //TODO: Make this bigger once its dynamically loading/drawing
	public static final int ZONE_HEIGHT = 15;  //TODO: different sized zones? 
	
	private int x; //World location
	private int y;
	
	/**
	 * 
	 * @param x Starting x location 
	 * @param y Starting y location
	 */
	public Map(int x, int y){
		this.x = x;
		this.y = y;
	}
	
	public boolean generateRandomMap(){
		return false;
	}
	
	public boolean initializeMap(int[][] tileTypes){
		mTiles = new Tile[ZONE_WIDTH][ZONE_HEIGHT];
		for(int col = 0; col < Map.ZONE_WIDTH; col++){
			for(int row = 0; row < Map.ZONE_HEIGHT; row++){
				int type = tileTypes[row][col];
				mTiles[col][row] = new Tile(type, col, row);
			}
		}
		
		updateSurroundingTiles(null, -1);
		return false;
	}
	
	public void draw(GL10 gl, PointF pLoc){
		for(int col = 0; col < Map.LOAD_WIDTH; col++){
			for(int row = 0; row < Map.LOAD_HEIGHT; row++){
				mLoadedTiles[col][row].draw(gl);
			}
		}
	}
	
	/***
	 * This will update mLoadedTiles, to load the tiles surrounding the player
	 * 
	 * @param playerLoc The current player location, can be null to denote init
	 * @param direction The direction the player moved 
	 */
	public void updateSurroundingTiles(PointF playerLoc, int direction){
		if(mLoadedTiles == null){
			mLoadedTiles = new Tile[LOAD_WIDTH][LOAD_HEIGHT];
		}
		
		if(playerLoc == null){
			for(int col = 0; col < LOAD_WIDTH; col++){
				for(int row = 0; row < LOAD_HEIGHT; row++){
					mLoadedTiles[col][row] = mTiles[col][row];
				}
			}
		}else{
			//TODO:  if direction is positive, then just load that direction + 2,3 tiles out
			//else, assume the player somehow got dropped in the middle of map, reload all tiles
			
			//Translate loc into zone x/y?
			int startX = Math.max((int)playerLoc.x - (LOAD_WIDTH /2), 0);
			int startY = Math.max((int)playerLoc.y - (LOAD_HEIGHT/2), 0);
			
			int endX = Math.min(startX + LOAD_WIDTH, ZONE_WIDTH);
			int endY = Math.min(startY + LOAD_HEIGHT, ZONE_HEIGHT);
			
			for(int col = startX; col < endX; col++){
				for(int row = startY; row < endY; row++){
					mLoadedTiles[col-startX][row-startY] = mTiles[col][row];
				}
			}
		}
	}
	
	public Tile[][] getTiles(){ return mTiles; }
	public Tile getTile(int x, int y){ return mTiles[y][x]; }
	
	public static int[][] staticMap = new int[][]{
			{14,14,14,14,14,14,14,14,14,14,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,14,11,4,4,4,4,4,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,14,8,4,4,4,4,13,11,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,14,8,4,4,4,13,14,8,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,14,8,4,4,13,14,14,8,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,14,14,5,4,13,14,14,14,8,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,14,5,6,4,4,10,14,14,14,5,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,5,4,4,4,4,4,14,14,14,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,11,4,4,4,4,13,14,14,5,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,8,4,4,4,4,7,14,14,5,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,14,5,4,4,4,4,10,14,14,5,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,5,4,4,4,4,4,4,14,5,4,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,14,8,4,4,4,4,4,4,6,4,4,4,4,4,4,4,4,4,4},
			{14,14,14,14,14,14,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
	};
	
}
